<?php
namespace Operator\Model;
use Think\Model;
/**
 * 基础model
 */
class BaseModel extends Model{
    /**
     * 提取二维数组的第一个元素，拼接成一维数组 兼容php5.4
     * @param array $arr 需要处理的二维数组
     * @return array     处理完成的一维数组
     */
    protected function levelDown($arr){
        return array_map('array_shift', $arr);
    }

    /**
     * 实现array_column的功能
     * @param array $arr 需要处理的二维数组
     * @return array
     */
    protected function array_cloumn($arr, $key){
        $temp = [];
        foreach($arr as $v){
            $temp[] = $v[$key];
        }
        return $temp;
    }

    /**
     * 提取二维数组的第一个元素作为索引
     * @param array $arr 需要处理的二维数组
     * @return array
     */
    protected function changeIndex($arr){
        return  array_combine(array_map('array_shift', $arr), $arr);
    }

    /**
     * 添加数据
     * @param  array $data  添加的数据
     * @return int          新增的数据id
     */
    public function addData($data){
        // 去除键值首尾的空格
        foreach ($data as $k => $v) {
            $data[$k]=trim($v);
        }
        $id=$this->add($data);
        return $id;
    }

    /**
     * 修改数据
     * @param   array   $map    where语句数组形式
     * @param   array   $data   数据
     * @return  boolean         操作是否成功
     */
    public function editData($map,$data){
        // 去除键值首位空格
        foreach ($data as $k => $v) {
            $data[$k]=trim($v);
        }
        $result=$this->where($map)->save($data);
        return $result;
    }

    /**
     * 删除数据
     * @param   array   $map    where语句数组形式
     * @return  boolean         操作是否成功
     */
    public function deleteData($map){
        if (empty($map)) {
            die('where为空的危险操作');
        }
        $result=$this->where($map)->delete();
        return $result;
    }

    /**
     * 数据排序
     * @param  array $data   数据源
     * @param  string $id    主键
     * @param  string $order 排序字段
     * @return boolean       操作是否成功
     */
    public function orderData($data,$id='id',$order='order_number'){
        foreach ($data as $k => $v) {
            $v=empty($v) ? null : $v;
            $this->where(array($id=>$k))->save(array($order=>$v));
        }
        return true;
    }

    /**
     * 获取全部数据
     * @param  string $type  tree获取树形结构 level获取层级结构
     * @param  string $order 排序方式
     * @return array         结构数据
     */
    public function getTreeData($type='tree',$order='',$name='name',$child='id',$parent='pid'){
        // $model_name = strtolower(MODULE_NAME);
        // $pid = session("{$model_name}_user.pid")?session("{$model_name}_user.pid"):session("{$model_name}_user.{$model_name}_id");
        // $power = M( $model_name.'_auth_group' )
        //     ->field('rules')
        //     ->where(['admin_id'=>$pid])
        //     ->select();

        // $power = implode(',',$this->levelDown($power));

        // 判断是否需要排序
        if(empty($order)){
            $data=$this->where()->select();
        }else{
            $data=$this->where()->order($order.' is null,'.$order)->select();
        }

        // 获取树形或者结构数据
        if($type=='tree'){
            $data=\Org\Nx\Data::tree($data,$name,$child,$parent);
        }elseif($type="level"){
            $data=\Org\Nx\Data::channelLevel($data,0,'&nbsp;',$child);
        }
        return $data;
    }

    /**
     * 获取分页数据
     * @param  subject  $model  model对象
     * @param  array    $map    where条件
     * @param  string   $order  排序规则
     * @param  integer  $limit  每页数量
     * @param  integer  $field  $field
     * @return array            分页数据
     */
    public function getPage($model,$map,$order='',$limit=10,$field=''){
        $count=$model
            ->where($map)
            ->count();
        $page=new_page($count,$limit);
        // 获取分页数据
        if (empty($field)) {
            $list=$model
                ->where($map)
                ->order($order)
                ->limit($page->firstRow.','.$page->listRows)
                ->select();
        }else{
            $list=$model
                ->field($field)
                ->where($map)
                ->order($order)
                ->limit($page->firstRow.','.$page->listRows)
                ->select();
        }
        $data=array(
            'data'=>$list,
            'page'=>$page->show()
            );
        return $data;
    }


    //导出excel共同方法
    public function exportExcel($expTitle,$expCellName,$expTableData){
        ob_end_clean();
        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称
        $fileName = $expTitle.date('_YmdHis');//or $xlsTitle 文件名称可根据自己情况设定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);

        vendor("PHPExcel.PHPExcel");

        $objPHPExcel = new \PHPExcel();
        $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
        /*  $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8);
          $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
          $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(30);
          $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);*/

        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
        // $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.'  Export time:'.date('Y-m-d H:i:s'));
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle);
        for($i=0;$i<$cellNum;$i++){
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
        }
        // Miscellaneous glyphs, UTF-8
        for($i=0;$i<$dataNum;$i++){
            for($j=0;$j<$cellNum;$j++){
                $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]);
            }
        }
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印inline本窗口打印
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        exit;
    }

    /**
     * 运营商写操作日志
     */
    public  function  oplog($content){
        $admin_id=session('operator_user.pid')==0?session('operator_user.operator_id'):session('operator_user.pid');
        $data['log_content']=$content;
        $data['log_time']=time();
        $data['log_ip']=get_client_ip();
        $data['inputer']=session('operator_user.operator_id');
        $data['inputer_name']=session('operator_user.operator_account').'|'.session('operator_user.operator_name');
        $data['operator_id']=$admin_id;
        M('oplog')->add($data);
    }
}
